package com.corpgovernment.common.utils;

import com.ctrip.corp.obt.generic.utils.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;

public class BigDecimalUtil {

    private static final BigDecimal ZERO = new BigDecimal(0);

    /**
     * 转String，去除末尾多余0
     */
    public static String toPlainString(BigDecimal num) {
        return num == null ? StringUtils.EMPTY : num.stripTrailingZeros().toPlainString();
    }

    /**
     * 单位换算成万，可保留六位小数
     */
    public static String toTenThousandStr(BigDecimal num) {
        return zeroOrNull(num) ? "--" : toPlainString(num.divide(new BigDecimal(10000), 6, RoundingMode.DOWN)) + "万";
    }

    /**
     * 单位换算成万，可保留六位小数
     */
    public static BigDecimal toTenThousand(BigDecimal num) {
        return zeroOrNull(num) ? null : num.divide(new BigDecimal(10000), 6, RoundingMode.DOWN);
    }

    /**
     * 为空或等于0
     */
    private static boolean zeroOrNull(BigDecimal num) {
        return num == null || num.compareTo(ZERO) == 0;
    }

	/**
	 * 单位换算成万，可保留六位小数
	 */
	public static String getScaleString(BigDecimal num, int scale) {
		if (num == null) {
			return "";
		}
		return num.setScale(scale, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();
	}

	/**
	 * Double换算成String，可保留六位小数
	 */
	public static String getScaleString(Double num, int scale) {
		if (num == null) {
			return "";
		}
		return BigDecimal.valueOf(num).setScale(scale, BigDecimal.ROUND_HALF_UP).stripTrailingZeros().toPlainString();
	}

	/**
	 * 获取BigDecimal 如果是null 返回0
	 *
	 * @param num
	 * @return
	 */
	public static BigDecimal get(BigDecimal num) {
		if (Objects.nonNull(num)) {
			return num;
		} else {
            return BigDecimal.ZERO;
        }
    }

	/**
	 * 安全的比较方法（null永远认为是最小的，2个都是null则相等）
	 *
	 * @param source
	 * @param target
	 * @return
	 */
	public static int safeCompare(BigDecimal source, BigDecimal target) {
		if (source == null && target == null) {
			return 0;
		} else if (source == null) {
			return -1;
		} else if (target == null) {
			return 1;
		}
		return source.compareTo(target);
	}
}